package com.example.rpc_core;

import com.example.rpc_core.config.RegistryConfig;
import com.example.rpc_core.constance.RpcConstant;
import com.example.rpc_core.config.RpcConfig;

import com.example.rpc_core.register.Register;
import com.example.rpc_core.register.RegistryFactory;
import com.example.rpc_core.util.RpcConfigUtil;

import lombok.extern.slf4j.Slf4j;

/**
 * 框架应用启动类
 */
@Slf4j
public class RpcApplication {
    private static volatile RpcConfig ReallyrpcConfig;

    public static void init(RpcConfig rpcConfig) {
        ReallyrpcConfig=rpcConfig;
        log.info("初始化RPC框架,config:{},fileType:{}",ReallyrpcConfig.toString());
        //注册中心初始化
        RegistryConfig registryConfig=ReallyrpcConfig.getRegistryConfig();
        Register registry = RegistryFactory.getRegistry(registryConfig.getRegistryType());
        registry.init(registryConfig);
        log.info("注册中心初始化完成,config:{}",registryConfig);

        //退出程序时删除注册信息
        Runtime.getRuntime().addShutdownHook(new Thread(registry::destroy));
    }

    public static void init(){
        RpcConfig rpcConfig;
        try {
            rpcConfig= RpcConfigUtil.loadConfig(RpcConfig.class, RpcConstant.DEFAULT_CONFIG_PREFIX,RpcConstant.DEFAULT_CONFIG_FILETYPE);
        } catch (Exception e) {
            //加载失败使用默认值
            rpcConfig=new RpcConfig();
        }
        init(rpcConfig);

    }
    /**
     * 获取配置
     * @return
     */

    public static RpcConfig getRpcConfig(){
        if (ReallyrpcConfig==null){
            synchronized (RpcApplication.class){
                if (ReallyrpcConfig==null){
                    init();
                }
            }
        }
        return ReallyrpcConfig;
    }

}
